[libcpu][arm][cortex-a] Fixup mmu setup early#11094
[libcpu][arm][cortex-a] Fixup mmu setup early#11094laidene wants to merge 2 commits intoRT-Thread:masterfrom
Conversation
Correct the starting virtual address of _reset alignment to 16MB
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
fe6cbd7 to
4b2ed0e
Compare
There was a problem hiding this comment.
Pull request overview
This PR fixes a critical bug in the early MMU memory setup for ARM Cortex-A processors. The original code incorrectly performed a modulo operation instead of an alignment operation when calculating the starting virtual address for MMU mapping.
Key Changes:
- Corrected virtual address alignment from modulo operation
va &= (0x1000000 - 1)to proper downward alignmentva &= ~(0x1000000 - 1) - This fix reduces excessive memory mapping iterations during early boot (from ~1536 iterations to just 2 in the qemu-vexpress-a9 example)
- Ensures proper 16MB boundary alignment as intended by the design
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
在
rt_hw_mem_setup_early()函数中,用于对齐_reset符号起始虚拟地址的代码存在错误。原代码使用va &= (0x1000000 - 1);执行的是取模运算(保留低24位),而不是向下对齐到16MB边界。这会导致虚拟地址对齐错误,影响早期MMU内存映射的正确设置,可能导致系统启动失败或内存映射异常。In the
rt_hw_mem_setup_early()function, the code used to align the starting virtual address of the_resetsymbol is incorrect. The original codeva &= (0x1000000 - 1);performs a modulo operation (keeping the lower 24 bits) instead of aligning down to the 16MB boundary. This causes incorrect virtual address alignment, which affects the correct setup of early MMU memory mapping and may lead to system boot failure or memory mapping exceptions.你的解决方案是什么 (what is your solution)
将错误的取模运算
va &= (0x1000000 - 1);修正为正确的向下对齐操作va &= ~(0x1000000 - 1);。Change the incorrect modulo operation
va &= (0x1000000 - 1);to the correct alignment-down operationva &= ~(0x1000000 - 1);.请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up改动说明
在原来的代码中,虚拟地址va是_reset对16M的取模运算。此时 va < 16M, 这样会导致mmu要映射的空间非常大。

以qemu-vexpress-a9为例:
修复以后

测试
早期mmu映射不会影响后续功能。修复也只是减少映射空间的循环时间。
